package Java.view.game.zhajinhua;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class PokerValue {
    private zhajinhuaFX zhajinhuaFX;
    private static final int SAME_POINT = 60 * 100000;
    private static final int STRAIGHT = 20 * 100000;
    private static final int SAME_COLOR = 30 * 100000;
    private static final int SAME_COLOR_STRAIGHT = STRAIGHT + SAME_COLOR;
    private static final int PAIR = 10 * 100000;

    public PokerValue(zhajinhuaFX f){
        this.zhajinhuaFX =f;
    }

    /**
     * 比牌
     *
     * @return 根据牌型以及牌面返回一个int
     */
    public static int judge(ArrayList<Poker> handCards) {//返回一个七位数代表牌面大小
        Collections.sort(handCards);//实现了Comparable 降序
        int value = 0;
        //后六位 点数
        if (isPair(handCards)) {
            if (handCards.get(0).getScore().num == handCards.get(1).getScore().num)
                value += handCards.get(0).getScore().num * 10000
                        + handCards.get(0).getScore().num * 100
                        + handCards.get(2).getScore().num;
            else
                value += handCards.get(1).getScore().num * 10000
                        + handCards.get(1).getScore().num * 100
                        + handCards.get(0).getScore().num;
        } else {//单牌
            value += handCards.get(0).getScore().num * 10000
                    + handCards.get(1).getScore().num * 100
                    + handCards.get(2).getScore().num;
        }

        //最高位 牌型
        if (isSameScore(handCards))//豹子 6
            value += SAME_POINT;
        else if (isSameColorStraight(handCards))//同花顺 5
            value += SAME_COLOR_STRAIGHT;
        else if (isSameColor(handCards))//金花 3
            value += SAME_COLOR;
        else if (isStraight(handCards))//顺子 2
            value += STRAIGHT;
        else if (isPair(handCards)) {//对子 1
            value += PAIR;
        } else {
            //单牌
        }
        return value;
    }

    private static boolean isSameColor(List<Poker> handCards) {//同花
        return handCards.get(0).getSuit() == handCards.get(1).getSuit() &&
                handCards.get(1).getSuit() == handCards.get(2).getSuit();
    }

    private static boolean isPair(List<Poker> handCards) {//对子
        return handCards.get(0).getScore().getScoreNum() == handCards.get(1).getScore().getScoreNum()
                || handCards.get(1).getScore().getScoreNum() == handCards.get(2).getScore().getScoreNum()
                || handCards.get(0).getScore().getScoreNum() == handCards.get(2).getScore().getScoreNum();
    }

    private static boolean isStraight(List<Poker> handCards) {//顺子
        Collections.sort(handCards);
        return Math.abs(handCards.get(0).getScore().getScoreNum() - handCards.get(1).getScore().getScoreNum()) == 1
                && Math.abs(handCards.get(1).getScore().getScoreNum() - handCards.get(2).getScore().getScoreNum()) == 1;

    }

    private static boolean isSameColorStraight(List<Poker> handCards) {//顺金
        return isSameColor(handCards) && isStraight(handCards);
    }

    private static boolean isSameScore(List<Poker> handCards) {//豹子
        return handCards.get(0).getScore() == handCards.get(1).getScore()
                && handCards.get(2).getScore() == handCards.get(1).getScore();

    }

//    /**
//     * 重新摆放扑克牌的位置。
//     *
//     * @param m    游戏窗体实例，用于访问和更新游戏界面。
//     * @param list 扑克牌列表，包含需要重新摆放的所有扑克牌。
//     * @param flag 标志位，决定扑克牌的摆放位置模式：
//     *             - 如果 flag 为 0，扑克牌将摆放在界面的左侧。
//     *             - 如果 flag 为 1，扑克牌将摆放在界面的底部中央。
//     *             - 如果 flag 为 2，扑克牌将摆放在界面的右侧。
//     */
//    public static void rePosition(zhajinhuaJFrame m, ArrayList<Poker> list, int flag) {
//        Point p=new Point();// 创建一个点对象，用来确定每张牌的新位置
//
//        // 根据 flag 的值设置扑克牌的新起始位置
//        if (flag == 0) {
//            p.x = 50;  // 设置起始 x 坐标为 50
//            p.y = (450 / 2) - (list.size() + 1) * 15 / 2;  // 垂直居中，每张牌向下移动15个单位
//        } else if (flag == 1) {
//            p.x = (800 / 2) - (list.size() + 1) * 21 / 2;  // 水平居中，每张牌向右移动21个单位
//            p.y = 450;  // 设置 y 坐标在界面底部
//        } else if (flag == 2) {
//            p.x = 700;  // 设置 x 坐标靠近界面的右侧
//            p.y = (450 / 2) - (list.size() + 1) * 15 / 2;  // 垂直居中，每张牌向下移动15个单位
//        }
//
//        // 遍历所有扑克牌，将它们移动到新的位置
//        for (Poker poker : list) {
//            Common.move(poker, poker.getLocation(), p);  // 调用 move 方法移动扑克牌
//            m.container.setComponentZOrder(poker, 0);  // 将扑克牌置于容器的最上层
//
//            // 根据 flag 更新下一张牌的位置
//            if (flag == 1) {
//                p.x += 21;  // 水平方向排列，每张牌之间间隔21个单位
//            } else {
//                p.y += 15;  // 垂直方向排列，每张牌之间间隔15个单位
//            }
//        }
//    }
}
